const jwt = require('jsonwebtoken')
const { code } = require('../static/secret')

module.exports = {
  errorHandle: async function (ctx, next) {
    // if (ctx.header && ctx.header.authorization) {
    //   const token = ctx.header.authorization.split(' ')[1]
    //   try {
    //     await jwt.verify(token, code)
    //   } catch (err) {
    //     // console.log(err)
    //     if (err) {
    //       console.log('fuck')
    //       ctx.body = { status: 401 }
    //       if (err.name === 'TokenExpiredError') {
    //         ctx.body.message = 'token串已过期，请及时更新'
    //         const { username } = await jwt.decode(token)
    //         const newToken = await jwt.sign({ username: username }, code, { expiresIn: '1h' })
    //         ctx.body.data = { token: newToken }
    //         return
    //       } else if (err.name === 'JsonWebTokenError') {
    //         ctx.body.message = 'token格式错误或未携带签名，签名无效'
    //         ctx.body.data = {}
    //         return
    //       } else if (err.name === 'NotBeforeError') {
    //         ctx.body.message = 'token仍未生效'
    //         ctx.body.data = {}
    //         return
    //       } else {
    //         throw err
    //       }
    //     }
    //   }
    // }
    // await next()
    // 编写中间件必须拥有next() 进入下一个中间件如果可以还可以编写相应的语句来实现从洋葱圈返回后的操作
    // return next().catch((err) => {
    //   console.log('fuck')
    //   if (err.status === 401) {
    //     ctx.status = 401
    //     if (err.name === 'JsonWebTokenError') {
    //       ctx.mesage = 'token格式错误或未携带签名，签名无效'
    //       ctx.body.data = {}
    //     } else if (err.name === 'NotBeforeError') {
    //       ctx.message = 'token仍未生效'
    //       ctx.body.data = {}
    //     } else if (err.name === 'TokenExpiredError') {
    //       if (ctx.header && ctx.header.authorization) {
    //         ctx.message = 'token串已过期，请及时更新'
    //         const token = ctx.header.authorization.split(' ')[1]
    //         const { username } = jwt.decode(token)
    //         const newToken = jwt.sign({ username: username }, code, { expiresIn: '1h' })
    //         ctx.body.data = { token: newToken }
    //       }
    //     }
    //   }
    // })
    return await next().catch(async (err1) => {
      if (err1.status === 401) {
        const tokenCode = (ctx.header && ctx.header.authorization) ? ctx.header.authorization : null
        const token = (tokenCode && /^Bearer \S*/.test(tokenCode)) ? tokenCode.split(' ')[1] : null
        try {
          await jwt.verify(token, code)
        } catch (err) {
          ctx.body = { status: 401 }
          if (err.name === 'TokenExpiredError') {
            ctx.body.message = 'token串已过期，请及时更新'
            // const token = ctx.header.authorization.split(' ')[1]
            const { username } = await jwt.decode(token)
            const newToken = await jwt.sign({ username: username }, code, { expiresIn: '1h' })
            ctx.body.data = { token: newToken }
          }
          if (err.name === 'JsonWebTokenError') {
            ctx.body.message = 'token格式错误或未携带签名，签名无效'
            ctx.body.data = {}
          }
        }
      } else {
        throw err1
      }
    })
  }
}
